gl renderer: Make creating render targets easier
authorTimm Bäder <mail@baedert.org>
Wed, 22 May 2019 05:10:57 +0000 (07:10 +0200)
committerTimm Bäder <mail@baedert.org>
Thu, 23 May 2019 16:42:00 +0000 (18:42 +0200)
gsk/gl/gskgldriver.c
gsk/gl/gskgldriverprivate.h
gsk/gl/gskglimage.c
gsk/gl/gskglrenderer.c

index 19ad7b1a787b23a3a2e2cd23d1704bb51f7cb2eb..d73575da062522b1c5cc26c37c15f8ecfd605786 100644 (file)
@@ -585,21 +585,6 @@ gsk_gl_driver_set_texture_for_pointer (GskGLDriver *self,
   g_hash_table_insert (self->pointer_textures, pointer, GINT_TO_POINTER (texture_id));
 }
 
-int
-gsk_gl_driver_create_permanent_texture (GskGLDriver *self,
-                                        float        width,
-                                        float        height)
-{
-  Texture *t;
-
-  g_return_val_if_fail (GSK_IS_GL_DRIVER (self), -1);
-
-  t = create_texture (self, width, height);
-  t->permanent = TRUE;
-
-  return t->texture_id;
-}
-
 int
 gsk_gl_driver_create_texture (GskGLDriver *self,
                               float        width,
@@ -614,11 +599,11 @@ gsk_gl_driver_create_texture (GskGLDriver *self,
   return t->texture_id;
 }
 
-int
-gsk_gl_driver_create_render_target (GskGLDriver *self,
-                                    int          texture_id,
-                                    gboolean     add_depth_buffer,
-                                    gboolean     add_stencil_buffer)
+static int
+create_render_target (GskGLDriver *self,
+                      int          texture_id,
+                      gboolean     add_depth_buffer,
+                      gboolean     add_stencil_buffer)
 {
   GLuint fbo_id, depth_stencil_buffer_id;
   Texture *t;
@@ -673,6 +658,38 @@ gsk_gl_driver_create_render_target (GskGLDriver *self,
   return fbo_id;
 }
 
+void
+gsk_gl_driver_create_render_target (GskGLDriver *self,
+                                    int          width,
+                                    int          height,
+                                    int         *out_texture_id,
+                                    int         *out_render_target_id)
+{
+  int texture_id, render_target;
+
+  texture_id = gsk_gl_driver_create_texture (self, width, height);
+  gsk_gl_driver_bind_source_texture (self, texture_id);
+  gsk_gl_driver_init_texture_empty (self, texture_id);
+
+  render_target = create_render_target (self, texture_id, FALSE, FALSE);
+
+  *out_texture_id = texture_id;
+  *out_render_target_id = render_target;
+}
+
+/* Mark the texture permanent, meaning it won'e be reused by the GLDriver.
+ * E.g. to store it in some other cache. */
+void
+gsk_gl_driver_mark_texture_permanent (GskGLDriver *self,
+                                      int          texture_id)
+{
+  Texture *t = gsk_gl_driver_get_texture (self, texture_id);
+
+  g_assert_nonnull (t);
+
+  t->permanent = TRUE;
+}
+
 void
 gsk_gl_driver_bind_source_texture (GskGLDriver *self,
                                    int          texture_id)
index ee34ccd092437511adf24a1c59ea187e6115ae69..1e57a855f1edb535bce6bc00ea6e9fd4f669157b 100644 (file)
@@ -39,17 +39,16 @@ int             gsk_gl_driver_get_texture_for_pointer   (GskGLDriver     *driver
 void            gsk_gl_driver_set_texture_for_pointer   (GskGLDriver     *driver,
                                                          gpointer         pointer,
                                                          int              texture_id);
-int             gsk_gl_driver_create_permanent_texture  (GskGLDriver     *driver,
-                                                         float            width,
-                                                         float            height);
 int             gsk_gl_driver_create_texture            (GskGLDriver     *driver,
                                                          float            width,
                                                          float            height);
-int             gsk_gl_driver_create_render_target      (GskGLDriver     *driver,
-                                                         int              texture_id,
-                                                         gboolean         add_depth_buffer,
-                                                         gboolean         add_stencil_buffer);
-
+void            gsk_gl_driver_create_render_target      (GskGLDriver     *driver,
+                                                         int              width,
+                                                         int              height,
+                                                         int             *out_texture_id,
+                                                         int             *out_render_target_id);
+void            gsk_gl_driver_mark_texture_permanent    (GskGLDriver     *self,
+                                                         int              texture_id);
 void            gsk_gl_driver_bind_source_texture       (GskGLDriver     *driver,
                                                          int              texture_id);
 
index 6d91b355687d0dcb4fc2b7dd374c95dc81c7887c..0de2e75bdc558e365f532ddcfb9394d7e17eee0b 100644 (file)
@@ -8,12 +8,13 @@ gsk_gl_image_create (GskGLImage  *self,
                      int          width,
                      int          height)
 {
-  self->texture_id = gsk_gl_driver_create_permanent_texture (gl_driver, width, height);
+  self->texture_id = gsk_gl_driver_create_texture (gl_driver, width, height);
   self->width = width;
   self->height = height;
 
   gsk_gl_driver_bind_source_texture (gl_driver, self->texture_id);
   gsk_gl_driver_init_texture_empty (gl_driver, self->texture_id);
+  gsk_gl_driver_mark_texture_permanent (gl_driver, self->texture_id);
 }
 
 void
index fbc2c0a4e27a5c226805fc8759a7e7b4057fbd20..43b9b1caa59e568949a820d218e8dd0ec74f7887 100644 (file)
@@ -1476,16 +1476,13 @@ render_outset_shadow_node (GskGLRenderer       *self,
       int prev_render_target;
       GskRoundedRect blit_clip;
 
-      texture_id = gsk_gl_driver_create_texture (self->gl_driver, texture_width, texture_height);
-      gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id);
-      gsk_gl_driver_init_texture_empty (self->gl_driver, texture_id);
+      gsk_gl_driver_create_render_target (self->gl_driver, texture_width, texture_height,
+                                          &texture_id, &render_target);
       gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id,
                                           "Outset Shadow Temp %d", texture_id);
-      render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, FALSE, FALSE);
       gdk_gl_context_label_object_printf  (self->gl_context, GL_FRAMEBUFFER, render_target,
                                            "Outset Shadow FB Temp %d", render_target);
 
-
       graphene_matrix_init_ortho (&item_proj,
                                   0, texture_width, 0, texture_height,
                                   ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
@@ -1513,12 +1510,10 @@ render_outset_shadow_node (GskGLRenderer       *self,
         { { texture_width,                }, { 1, 1 }, },
       });
 
-      blurred_texture_id = gsk_gl_driver_create_permanent_texture (self->gl_driver, texture_width, texture_height);
-      gsk_gl_driver_bind_source_texture (self->gl_driver, blurred_texture_id);
-      gsk_gl_driver_init_texture_empty (self->gl_driver, blurred_texture_id);
+      gsk_gl_driver_create_render_target (self->gl_driver, texture_width, texture_height,
+                                          &blurred_texture_id, &blurred_render_target);
       gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, blurred_texture_id,
                                           "Outset Shadow Cache %d", blurred_texture_id);
-      blurred_render_target = gsk_gl_driver_create_render_target (self->gl_driver, blurred_texture_id, TRUE, TRUE);
       gdk_gl_context_label_object_printf  (self->gl_context, GL_FRAMEBUFFER, render_target,
                                            "Outset Shadow Cache FB %d", render_target);
 
@@ -1556,6 +1551,7 @@ render_outset_shadow_node (GskGLRenderer       *self,
       ops_set_projection (builder, &prev_projection);
       ops_set_render_target (builder, prev_render_target);
 
+      gsk_gl_driver_mark_texture_permanent (self->gl_driver, blurred_texture_id);
       gsk_gl_shadow_cache_commit (&self->shadow_cache,
                                   &offset_outline,
                                   blur_radius,
@@ -2773,13 +2769,9 @@ add_offscreen_ops (GskGLRenderer         *self,
       }
   }
 
-  texture_id = gsk_gl_driver_create_texture (self->gl_driver, width, height);
-  gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id);
-  gsk_gl_driver_init_texture_empty (self->gl_driver, texture_id);
+  gsk_gl_driver_create_render_target (self->gl_driver, width, height, &texture_id, &render_target);
   gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id,
                                       "Offscreen<%s> %d", child_node->node_class->type_name, texture_id);
-
-  render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, TRUE, TRUE);
   gdk_gl_context_label_object_printf  (self->gl_context, GL_FRAMEBUFFER, render_target,
                                        "Offscreen<%s> FB %d", child_node->node_class->type_name, render_target);